from functools import total_ordering
import dash,os
from dash import dcc, html


from sqlalchemy import func
import pandas as pd
import numpy as np


from datetime import date
from server import server
from models import db, StatisticsData
import plotly.graph_objects as go



#画维修次数和完成率
def create_repair_count_chart(selected_org='all', selected_date=None):
    with server.app_context():
        if selected_date:
            # 如果提供了日期，则使用该日期
            stats = db.session.query(StatisticsData).filter(
                StatisticsData.stat_date == selected_date
            ).all()
        else:
            # 否则，查找最近的统计日期
            latest_date_row = db.session.query(func.max(StatisticsData.stat_date)).scalar()
            if not latest_date_row:
                return go.Figure() # 如果没有数据，返回一个空图表
            latest_date = latest_date_row
            stats = db.session.query(StatisticsData).filter(
                StatisticsData.stat_date == latest_date
            ).all()

        if selected_org != 'all':
            stats = [s for s in stats if s.org_shortname_c == selected_org]

        # 按维修完成次数降序排列
        stats.sort(key=lambda x: x.repair_complete_count or 0, reverse=True)

        org_names = [s.org_shortname_c for s in stats]
        repair_counts = [s.repair_complete_count or 0 for s in stats] # 修改这里
        # 修改这里，使用设备完好率
        equipment_intact_rates = [round((s.health_rate or 0) * 100, 2) for s in stats] # 修改这里，使用health_rate
        # print(f"p46 equipment_intact_rates={equipment_intact_rates}")
    fig = go.Figure()
    fig.add_trace(go.Bar(
        x=org_names,
        y=repair_counts,
        width=0.4,
        name='维修完成次数', # 修改这里
        marker_color='#3399ff',
        text=repair_counts,
        textposition='auto',
        textfont={'color': 'white', 'size': 10},
        yaxis='y'
    ))
    fig.add_trace(go.Scatter(
        x=org_names,
        y=equipment_intact_rates, # 修改这里，使用设备完好率
        name='设备完好率', # 修改这里，图例名称
        mode='lines+markers',
        line={'color': '#FFFFFF', 'width': 1},
        marker={'size': 6, 'color': '#FF9F40'},
        yaxis='y2'
    ))

    fig.update_layout(
        title={
            'text': '维修完成次数与设备完好率统计', # 修改这里
            'font': {'size': 14, 'color': 'white'},
            'x': 0.5,
            'y': 0.98,
            'xanchor': 'center',
            'yanchor': 'top'
        },
        plot_bgcolor="#112360",
        paper_bgcolor="#112360",
        font=dict(color='white'),
        margin=dict(l=0, r=0, t=30, b=50),
        legend=dict(
            orientation="h",
            yanchor="bottom",
            y=0.9,
            xanchor="center",
            x=0.5,
            bgcolor='rgba(0,0,0,0)'
        ),
        xaxis=dict(
            showgrid=False,
            tickangle=45,
            tickfont={'size': 10},
            showline=False,
            zeroline=False
        ),
        yaxis=dict(
            title='维修完成次数', # 修改这里
            showgrid=False,
            showticklabels=True,
            zeroline=False,
            automargin=True
        ),
        yaxis2=dict(
            title='设备完好率(%)', 
            showgrid=False,
            showticklabels=True,
            side='right',
            overlaying='y',
            zeroline=False,
            range=[70,110],
            automargin=True
        ),
        bargap=0.15,
        bargroupgap=0.1
    )
    return fig


def create_donut_chart2(data_type='maintain'):
    """
    创建保养/巡检完成率圆环图 (一期和二期)
    :param data_type: 'maintain' 或 'inspection'
    """
    # 读取Excel数据
    import pandas as pd
    try:
        df = pd.read_excel('modules/statistic/xlsx2/各机构保养巡检次数统计.xlsx', sheet_name='Sheet1')
    except FileNotFoundError:
        print("Error: 各机构保养巡检次数统计.xlsx not found.")
        # 返回一个空的Figure对象，并在标题中显示错误信息
        fig = go.Figure()
        fig.update_layout(
            title={'text': "错误: 统计文件未找到。", 'font': {'color': 'white'}},
            plot_bgcolor="#112360",
            paper_bgcolor="#112360"
        )
        # 直接返回一个包含两个dcc.Graph的html.Div，每个Graph都使用这个空的fig
        return html.Div([
            
            dcc.Graph(figure=fig, style={'height': '280px', 'width': '100%'}),
            dcc.Graph(figure=fig, style={'height': '280px', 'width': '100%'}) 
        ], style={'display': 'flex', 'flexDirection': 'column', 'alignItems': 'center'})
    except Exception as e:
        print(f"Error reading Excel file: {e}")
        # 返回一个空的Figure对象，并在标题中显示错误信息
        fig = go.Figure()
        fig.update_layout(
            title={'text': f"错误: 读取统计文件出错: {e}", 'font': {'color': 'white'}},
            plot_bgcolor="#112360",
            paper_bgcolor="#112360"
        )
        # 直接返回一个包含两个dcc.Graph的html.Div，每个Graph都使用这个空的fig
        return html.Div([
            dcc.Graph(figure=fig, style={'height': '280px', 'width': '100%'}),
            dcc.Graph(figure=fig, style={'height': '280px', 'width': '100%'}) 
        ], style={'display': 'flex', 'flexDirection': 'column', 'alignItems': 'center'})

    # 计算总数和完成数
    total = df['有效设备数量'].sum()

    if data_type == 'maintain':
        completed1 = df['一期保养'].sum()
        completed2 = df['二期保养'].sum()
        title_prefix = '保养'
    else:
        completed1 = df['一期巡检'].sum()
        completed2 = df['二期巡检'].sum()
        title_prefix = '巡检'

    # 计算完成率
    rate1 = round(completed1 / total * 100, 2) if total > 0 else 0
    rate2 = round(completed2 / total * 100, 2) if total > 0 else 0

    # 创建一期圆环图
    fig1 = go.Figure(data=[
        go.Pie(
            values=[100], # 100%的背景圆环
            hole=0.8,
            marker_colors=['#808080'], # 灰色背景
            showlegend=False,
            textinfo='none',
            hoverinfo='none'
        ),
        go.Pie(
            values=[rate1, 100 - rate1], # 完成率作为前景
            hole=0.8,
            marker_colors=['#FF9F40', 'rgba(0,0,0,0)'], # 橙色前景，透明背景
            showlegend=False,
            textinfo='none',
            hoverinfo='none',
            direction='clockwise',
            sort=False
        )
    ])
    fig1.update_layout(
        title={
            'text': f"一期",
            'font': {'size': 14, 'color': 'white'},
            'x': 0.5,
            'y': 0.3,
            'xanchor': 'center',
            'yanchor': 'middle'
        },
        plot_bgcolor="#112360",
        paper_bgcolor="#112360",
        font=dict(color='white'),
        margin=dict(l=10, r=10, t=10, b=10),
        annotations=[dict(text=f'{rate1}%', x=0.5, y=0.5, font_size=20, showarrow=False, font=dict(color='white'))]
    )

    # 创建二期圆环图
    fig2 = go.Figure(data=[
        go.Pie(
            values=[100], # 100%的背景圆环
            hole=0.8,
            marker_colors=['#808080'], # 灰色背景
            showlegend=False,
            textinfo='none',
            hoverinfo='none'
        ),
        go.Pie(
            values=[rate2, 100 - rate2], # 完成率作为前景
            hole=0.8,
            marker_colors=['#FF9F40', 'rgba(0,0,0,0)'], # 橙色前景，透明背景
            showlegend=False,
            textinfo='none',
            hoverinfo='none',
            direction='clockwise',
            sort=False
        )
    ])
    fig2.update_layout(
         title={
            'text': f"二期",
            'font': {'size': 14, 'color': 'white'},
            'x': 0.5,
            'y': 0.3,
            'xanchor': 'center',
            'yanchor': 'middle'
        },
        plot_bgcolor="#112360",
        paper_bgcolor="#112360",
        font=dict(color='white'),
        margin=dict(l=10, r=10, t=10, b=10),
        annotations=[dict(text=f'{rate2}%', x=0.5, y=0.5, font_size=20, showarrow=False, font=dict(color='white'))]
    )

    # 返回包含两个图的布局
    return html.Div([
        dcc.Graph(figure=fig1, style={'height': '180px', 'width': '50%', 'margin-top': '80px'}),
        dcc.Graph(figure=fig2, style={'height': '180px', 'width': '50%', 'margin-top': '80px'})
    ], style={'display': 'flex', 'flexDirection': 'row', 'justifyContent': 'space-around', 'alignItems': 'center'})


def create_evnet_area():
    # 读取超时维修记录
    xlsx_path = os.path.join('modules', 'statistic', 'xlsx2', '超时维修记录.xlsx')
    print(f"p259 Reading from {xlsx_path}")
    try:
        df = pd.read_excel(xlsx_path)
        n = len(df)
        records = df.head(2)
        def record_to_text(row):
            return f"{row['产品名称']} | {row['所属机构']} | {row['所属科室']} | {row['维修状态']} | 故障小时: {row['故障小时']}"
        data1 = record_to_text(records.iloc[0]) if n >= 1 else '无'
        data2 = record_to_text(records.iloc[1]) if n >= 2 else '无'
    except Exception as e:
        n = 0
        data1 = data2 = '无'
        print(f"p271 Error reading file {xlsx_path}: {e}")

    # 红色上标样式
    badge = html.Span(str(n), style={'color': 'white', 'background': 'red', 'border-radius': '8px', 'margin-right': '10px', 'font-size': '12px', 'padding': '0 5px', 'position': 'absolute', 'top': '-8px', 'right': '-8px'}) if n > 0 else None

    return html.Div([
        html.Div([
            html.Span('超时维修', style={'color': 'white', 'font-size': '14px', 'vertical-align': 'middle'}),
            html.A([
                html.Img(src='assets/icon/超时维修.png', style={'height': '60px', 'margin-right': '10px', 'vertical-align': 'middle', 'position': 'relative'}),
                badge if badge else None
            ], href='/dash/repair', target='_blank', style={'position': 'relative', 'display': 'inline-block', 'margin-right': '80px'}),
            html.Span('物流进度', style={'color': 'white', 'font-size': '14px','vertical-align':'middle','margin-right': '10px'}),
            html.A(
                html.Img(src='assets/icon/物流进度.png', style={'height': '60px'}),
                href='/dash/repair', target='_blank'
            ),
            
        ], style={'display': 'flex', 'justify-content': 'center', 'margin-bottom': '20px'}),
        html.Table([
            html.Tr([
                html.Td(html.Img(src='assets/icon/超时维修.png', style={'height': '28px', 'vertical-align': 'middle'}), style={'padding': '8px', 'border': '1px solid #ddd', 'color': 'white', 'text-align': 'center', 'width': '60px'}),
                html.Td(data1, style={'padding': '8px', 'border': '1px solid #ddd', 'color': 'white', 'text-align': 'center'})
            ]),
            html.Tr([
                html.Td(html.Img(src='assets/icon/超时维修.png', style={'height': '28px', 'vertical-align': 'middle'}), style={'padding': '8px', 'border': '1px solid #ddd', 'color': 'white', 'text-align': 'center', 'width': '60px'}),
                html.Td(data2, style={'padding': '8px', 'border': '1px solid #ddd', 'color': 'white', 'text-align': 'center'})
            ])
        ], style={'width': '100%', 'border-collapse': 'collapse', 'background-color': '#112360'}),
    ], style={'padding': '20px', 'background-color': '#112360', 'border-radius': '5px', 'color': 'white'})
  

def create_function_area():
    data1 = "公告通知：2024年11月29日，主题：数据为翼，……"
    data2 = "培训会议：2024年11月22日，类型：培训，地点：制造……"  
    return html.Div([
        html.Div([
            html.Span('公告通知', style={'color': 'white', 'font-size': '14px', 'vertical-align': 'middle'}),
            # 第一个图标链接
            html.A(
                html.Img(src='assets/icon/公告通知.png', style={'height': '50px', 'margin-right': '50px'}),
                href='/your-link-for-icon1',  # 替换为实际链接
                target='_blank'  # 在新标签页打开
            ),
            html.Span('培训会议', style={'color': 'white', 'font-size': '14px', 'vertical-align': 'middle'}),
            # 第二个图标链接
            html.A(
                html.Img(src='assets/icon/培训会议.png', style={'height': '50px','margin-right': '50px',}),
                href='/your-link-for-icon2',  # 替换为实际链接
                
                target='_blank'  # 在新标签页打开
            ),
            html.Span('信箱', style={'color': 'white', 'font-size': '14px', 'vertical-align': 'middle'}),
             # 第三个图标链接
            html.A(
                html.Img(src='assets/icon/信箱.png', style={'height': '50px', 'margin-right': '20px'}),
                href='/your-link-for-icon1',  # 替换为实际链接
                target='_blank'  # 在新标签页打开
            ),
        ], style={'display': 'flex', 'justify-content': 'center', 'margin-bottom': '20px'}),
         
        # 两行两列的表格
        html.Table([
            html.Tr([
                html.Td(html.Img(src='assets/icon/公告通知.png', style={'height': '28px', 'vertical-align': 'middle'}), style={'padding': '8px', 'border': '1px solid #ddd', 'color': 'white', 'text-align': 'center', 'width': '60px'}),
                html.Td(data1, style={'padding': '8px', 'border': '1px solid #ddd', 'color': 'white', 'text-align': 'center'})
            ]),
            html.Tr([
                html.Td(html.Img(src='assets/icon/培训会议.png', style={'height': '28px', 'vertical-align': 'middle'}), style={'padding': '8px', 'border': '1px solid #ddd', 'color': 'white', 'text-align': 'center', 'width': '60px'}),
                html.Td( data2, style={'padding': '8px', 'border': '1px solid #ddd', 'color': 'white', 'text-align': 'center'})
            ])
        ], style={'width': '100%', 'border-collapse': 'collapse', 'background-color': '#112360'}),

    ], style={'padding': '20px', 'background-color': '#112360', 'border-radius': '5px', 'color': 'white'})